package com.psychologyCommunity.Community.Contoller;

import com.psychologyCommunity.Community.service.AlphaService;
import com.psychologyCommunity.Community.util.CommunityUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/alpha")
public class AlphaController {

    @RequestMapping("/hello")
    @ResponseBody
    public String sayHey(){
        return "hello loco";
    }
    //controller 在处理请求的过程中 可以调用 service
//    @Autowired
//    private AlphaService alphaService;
//    public String getData(){
//        return alphaService.find();
//    }

    //GET请求
    // / Students?current=1&limit=20 比如说一个分页条件 告诉服务器当前是第几页 最多返回多少条数据
    @RequestMapping(path="/students",method = RequestMethod.GET) //明确是什么请求
    @ResponseBody
    public String getStudent(  //(name = "current",required = false,--代表可以不传 defaultValue = "1"--不传的默认值是多少
                               @RequestParam(name = "current",required = false,defaultValue = "1") int current,
                               @RequestParam(name = "limit",required = false,defaultValue = "1000") int limit){//只要这个参数名 和你传过来的参数名保持一致
        System.out.println(current);
        System.out.println(limit);
        return "some Student";
    }

    //student/123
    @RequestMapping(path = "/student/{id}",method = RequestMethod.GET)
    @ResponseBody
    public String getStudent(@PathVariable("id") int id){
        System.out.println(id);
        return "A student";
    }

    //POST请求
    @RequestMapping(path = "/studentP",method=RequestMethod.POST)
    @ResponseBody
    //形参的名字 和表单中的一致就会传过来
    public String saveStudent(String name,String age){ //只是示范 响应返回给一个简单的返回字符串
        System.out.println(name);
        System.out.println(age);
        return "save student  ok";
    }

    //响应HTML数据  不加@ResponseBody 就是返回HTML
    @RequestMapping(path = "/teacher",method=RequestMethod.GET)
    public ModelAndView getTeacher(){
       ModelAndView mav=new ModelAndView();
       mav.addObject("name","刘昊然");
       mav.addObject("age",16);
       mav.setViewName("/demo/view");//templates模板是固定的 所以写html的 文件名就行 不用加后缀
        return mav;
    }

    //Model 的类型的对象不是我们自己创建的，是前端控制器在调用这个方法时
    //发现Model，他就会自动实例化这个Model对象 传给你，因为这是一个bean
    //前端控制器只有这个对象的引用，在方法内部 往这个model存数据 他也能得到
    @RequestMapping(path = "/school",method=RequestMethod.GET)
    public String getSchool(Model model){
        model.addAttribute("name","湖北大学");
        model.addAttribute("age",90);
        return "/demo/view";
    }

    //响应JSON数据（异步请求）
    //Java对象 --》JSON对象 --》JS对象
    @RequestMapping(path = "/emp",method = RequestMethod.GET)
    @ResponseBody
    public Map<String,Object> getEmp(){
        Map<String ,Object> emp=new HashMap<String ,Object>();
        emp.put("name","loco");
        emp.put("age",22);
        emp.put("salary",800000);
        return emp;
    }

    //Cookie实例  --我们写的是服务端请求
    //先模拟浏览器访问服务器 第一次请求的时候，服务器要创建一个Cookie 把它发送给浏览器
    //写一个方法 接受浏览器的请求
    // --不管给浏览器返回会页面也好还是字符串也好，都是给浏览器做出响应，都是通过Response做出响应
    //而Cookie 它是存在于Response的头部，跟返回的具体内容没什么关系
    @RequestMapping(path = "/cookie/set",method = RequestMethod.GET)
    @ResponseBody
    public String setCookie(HttpServletResponse response){
        //创建cookie --这个对象在使用的时候必须传入参数，没有无参构造器 ，而且传的参数都是字符串
        //并且每一个构造器 只能存一对字符串 k v
        Cookie cookie=new Cookie("loco", CommunityUtil.generateUUID());

        //设置cookie 生效的范围  --浏览器 保存cookie后再访问服务器的时候，会把cookie自动的发送给服务器
        //这个cookie需要指定路径（以及其子路径）下有效，这样可以节约资源 要不然就是所有路径都有效
        cookie.setPath("/community/alpha");

        //设置Cookie的生存时间
        cookie.setMaxAge(60*10);//60s*10 ;10分钟

        //设置完 把它添加到响应里
        response.addCookie(cookie);

        return "set cookie";

    }

    @RequestMapping(path = "/cookie/get",method = RequestMethod.GET)
    @ResponseBody
    //Cookie对象的特点是来回传，数据量大不方便，而且客户端其他类型也不能识别 ；，只能存字符串，只能存少量的数据
    //如何可以get到cookie中众多属性的某一个 @CookieValue(" key ") 取到这个值赋给 后面定义的形参
    public String getCookie(@CookieValue("loco") String code){
        System.out.println(code); //要想
        return "get cookie";
    }

    //session 示例
    @RequestMapping(path = "/session/set",method = RequestMethod.GET)
    @ResponseBody
    //Session对象和cookie不一样，不需要手动创建，（服务器）springMVC可以自动帮我们创建Session并注入进来
    // 和Mode Request这些对象一样，只需要声明就行了
    public String setSession(HttpSession session){
        //这个session 是一直存在于服务端的，所以他里面存什么数据都行
        session.setAttribute("id",1);
        session.setAttribute("name","loco");
        return "set session";
    }
    @RequestMapping(path = "/session/get",method = RequestMethod.GET)
    @ResponseBody
    public String getSession(HttpSession session){ //直接可以拿
        System.out.println(session.getAttribute("id"));
        System.out.println(session.getAttribute("name"));
        return  "get session";
    }

    //ajax示例---请求的方式 一般都是 页面给服务器 通过异步的方式提交一些数据 保存完之后 给浏览器返回一个提示
    @RequestMapping(path = "/ajax",method = RequestMethod.POST)
    @ResponseBody  //因为是异步请求 返回的不是网页，是字符串
    public String testAjax(String name ,int age){ //浏览器提交的数据
        System.out.println(name);
        System.out.println(age);
        return CommunityUtil.getJSONString(0,"操作成功了！");
    }

}
